<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{padding: 0;margin: 0;}
        li{
            list-style: none;
        }
        .list li{
            line-height: 40px;
            border: 1px dashed #333;
        }
        .list li + li{
            border-top: 0;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <button class="addEle">点击新增</button>
        <ul class="list">
            <!-- <li data-index="0">01</li>
            <li data-index="1">02</li>
            <li data-index="2">03</li>
            <li data-index="3">04</li>
            <li data-index="4">05</li>
            <li data-index="5">06</li> -->
            <li>01</li>
            <li>02</li>
            <li>03</li>
            <li>04</li>
            <li>05</li>
            <li>06</li>
        </ul>
    </div>
</body>
<script>
    // 给每个li绑定点击事件 => 点击打印当前li和下标

    var addEle = document.querySelector(".addEle");
    var ul = document.querySelector(".list");
    var liList = ul.getElementsByTagName("li");
    // console.log(liList);

    

    // 循环绑定事件
    // 1. 循环绑定事件 -> 此时事件不会触发 => 循环结束全局的li和i => <li>06</li>  6
    // 2. 点击了li => 触发事件 => 执行函数中的代码, 函数中没有li和i =>向外跳一层找全局作用域 => 全局的li和i  <li>06</li>  6

    // 问题: 
    // for(var i=0;i<liList.length;i++){
    //     var li = liList[i];
    //     li.onclick = function(){
    //         console.log(li,i);
    //     }
    // }
    // console.log("页面加载完毕",li,i);

    // 解决方法: 
    // 1. 寻找替换的方案 
    // li  => this  (lix6 事件函数x6  => 每隔事件中的this 都是绑定事件的元素)
    // i   => a. 给每个元素绑定自定义属性 data-index,每次点击元素时获取其自定义属性data-index
    //        b. 


    // 2. 如果事件触发时能查找循环当前li和i => 就不会出现问题
    // 2.1  在事件对应的函数作用域和全局作用域之间 加一层函数作用域
    // for(var i=0;i<liList.length;i++){
    //     function fn(i){ // 形参 i = >  0 1 2 3 4 5
    //         var li = liList[i];
    //         li.onclick = function(){
    //             console.log(li,i);
    //         }
    //     }
    //     fn(i); // i 实际参数 0 1 2 3 4 5  => 函数调用6次
    // }

    // fn(0);
    // function fn(i){ // 形参 i = >  0 
    //     var li = liList[i];  // li = liList[0]
    //     li.onclick = function(){
    //         console.log(li,i);  // 事件函数中没有li和i, 向外跳一层找父作用域(函数作用域)
    //     }
    // }
    // ....


    // 2.2
    // Array.from(liList).forEach(function(li,i){
    //     li.onclick = function(){
    //         console.log(li,i);
    //     }
    // })



    // 2.3 
    // 注意: for循环的()中let const声明的变量,也是局部的

    for(let i=0;i<liList.length;i++){
        let li = liList[i];
        li.onclick = function(){
            console.log(li,i); // 事件函数中没有li和i, 向外跳一层找父作用域(块级作用域)
        } 
    }

    // 循环n次,产生n个块级作用域(两层)
    // 第一次循环
    // {
    //     let i = 0;
    //     {
    //         let li = liList[i];
    //         li.onclick = function(){
    //             console.log(li,i); // 事件函数中没有li和i, 向外跳一层找父作用域(块级作用域)
    //         } 
    //     }
    // }

    // {
    //     let i = 1;
    //     {
    //         let li = liList[i];
    //         li.onclick = function(){
    //             console.log(li,i); // 事件函数中没有li和i, 向外跳一层找父作用域(块级作用域)
    //         } 
    //     }
    // }










    function randColor() {
        var str = "0123456789abcdef";

        var colorStr = "#";
        for (var i = 0; i < 6; i++) {
            var index = Math.floor(Math.random() * 16); // 0-15的随机数 (下标)
            var char = str.charAt(index);
            colorStr += char;
        }
        return colorStr;
    }

</script>
</html>